package com.xinlin.framework.interceptor;

import com.xinlin.common.constant.Constants;
import com.xinlin.common.utils.NumberUtil;
import com.xinlin.common.utils.ObjectUtils;
import com.xinlin.common.utils.ServletUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 权限拦截器
 *
 * @author geekidea
 * @since 2018-11-08
 */
@Slf4j
@Component
public class PermissionInterceptor implements HandlerInterceptor {

//    @Autowired
//    private RedisUtil redisUtil;
//    @Autowired
//    private BalanceService balanceService;
//    @Autowired
//    private AppOperLogService appOperLogService;
//    @Autowired
//    private AppConfService appConfService;

    // 令牌自定义标识
    @Value("${token.header}")
    private String header;


    @Value("${app-plus.api-url}")
    private String apiUrl;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        log.info(" ip : {}  ,  url {} ", request.getRemoteAddr() , request.getRequestURI());
        if (request.getRequestURI().startsWith(apiUrl)) {
            //请求app的版本
            if (!checkVersion(request)) {
//                throw new SpringBootPlusException(ApiCode.APP_CHECK_VERSION_EXCEPTION.getCode(),ApiCode.APP_CHECK_VERSION_EXCEPTION.getMsg());
            }

        }

        return true;
    }

    /**
     * 检查app的版本
     *
     * @param request
     * @return
     */
    private boolean checkVersion(HttpServletRequest request) {

        String vercode = ServletUtils.getHeaderVal(Constants.HEADER_VERSION_CODE_KEY);
        log.info("【vercode】-->>{}", vercode);
//        //为空，不是数字，不通过
        if (StringUtils.isEmpty(vercode) || !NumberUtil.isNumber(vercode)) {
            return false;
        }
        Integer integer = Integer.valueOf(vercode);
        //取不到值，或者 小少规定的版本号 不能请求
//        AppConf app_check_version = appConfService.getByDictKey("app_check_version");
        int verCode = 10; //默认285 如果有配置，则以数据配置为准
//        if(ObjectUtils.isNotEmpty(app_check_version) && ObjectUtils.isNotEmpty(app_check_version.getDictValue())){
//            verCode = Integer.valueOf(app_check_version.getDictValue());
//        }
        if (ObjectUtils.isEmpty(integer) || integer.intValue() < verCode) {
            return false;
        }
        return true;
    }


    /**
     * 请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object object, ModelAndView mv)
            throws Exception {

    }

    /**
     * 在整个请求结束之后被调用，也就是在DispatcherServlet 渲染了对应的视图之后执行
     * （主要是用于进行资源清理工作）
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object object, Exception ex)
            throws Exception {
    }


}